Maximum performance of a team [Min Cost to Hire K Workers]¶
Time: O(NLogN); Space: O(N); hard
There are n engineers numbered from 1 to n and two arrays:
speed and efficiency, where speed[i] and efficiency[i] represent the speed and efficiency for the i-th engineer respectively.
Return the maximum performance of a team composed of at most k engineers, since the answer can be a huge number, return this modulo 10^9 + 7.
The performance of a team is the sum of their engineers’ speeds multiplied by the minimum efficiency among their engineers.
Example 1:
Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
Output: 60
Explanation:
We have the maximum performance of the team by selecting engineer 2 (with speed=10 and efficiency=4) and engineer 5 (with speed=5 and efficiency=7). That is, performance = (10 + 5) * min(4, 7) = 60.
Example 2:
Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
Output: 68
Explanation:
This is the same example as the first but k = 3. We can select engineer 1, engineer 2 and engineer 5 to get the maximum performance of the team. That is, performance = (2 + 10 + 5) * min(5, 4, 7) = 68.
Example 3:
Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
Output: 72
Constraints:
1 <= n <= 10^5
len(speed) == n
len(efficiency) == n
1 <= speed[i] <= 10^5
1 <= efficiency[i] <= 10^8
1 <= k <= n
Hints:
Keep track of the engineers by their efficiency in decreasing order.
For each engineer’s efficiency take the K highest speeds among the engineers previously tracked.
[1]:
import heapq
class Solution1(object):
"""
Time: O(NLogN)
Space: O(N)
"""
def maxPerformance(self, n, speed, efficiency, k):
"""
:type n: int
:type speed: List[int]
:type efficiency: List[int]
:type k: int
:rtype: int
"""
MOD = 10**9 + 7
result, s_sum = 0, 0
min_heap = []
for e, s in sorted(zip(efficiency, speed), reverse=True):
s_sum += s
heapq.heappush(min_heap, s)
if len(min_heap) > k:
s_sum -= heapq.heappop(min_heap)
result = max(result,s_sum*e)
return result % MOD
[2]:
s = Solution1()
n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 2
assert s.maxPerformance(n, speed, efficiency, k) == 60
n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 3
assert s.maxPerformance(n, speed, efficiency, k) == 68
n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 4
assert s.maxPerformance(n, speed, efficiency, k) == 72